package com.struts.action;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.CompoundRoot;
import com.opensymphony.xwork2.util.ValueStack;
import com.struts.pojo.Person;

/**
 * 对象栈数据存取操作
 * @author LC
 *
 */
public class OgnlForObjectStackAction extends ActionSupport{
	
	//==========================================================================\\
	//将数据存放到对象栈中，并在视图页面通过struts2提供的ognl标签进行显示
	
	/**
	 *  如果一个对象存在于对象栈中,那么该对象如果有set或者get方法，例如：
	       	getAaa(){
	         return "xxx";
	        }
		那么aaa会作为属性的名称,xxx会作为属性的值保存在对象栈中
	 */
	public String getAaa() {
		return "objectStack_pojo" ;
	}

	/**
	 * 把person对象放入到对象栈中,并在页面从利用ognl表达式获取对象属性值
	 * 方式：
	 * 		通过ActionContext.getContext().getValueStack().push()或通过对象栈实例化对象root.add()的方式压入对象栈
	 */
	public String addPojoToObjectStack() {
		Person person = new Person() ;
		person.setPid((long) 1) ;
		person.setName("zhangsan") ;
		ActionContext.getContext().getValueStack().push(person) ;
		return "objectStack_pojo" ;
	}
	
	/**
	 * 把基本数据类型、字符串类型、map、集合等没有提供getter方法的数据类型数据存放到对象栈中
	 * 方式1、通过ActionContext.getContext().getValueStack().push()或通过对象栈实例化对象root.add()的方式压入对象栈
	 * 造成问题：
	 * 		把一个基本数据类型数据字符串类型数据放入到对象栈中，对象栈的属性名称混乱，除栈顶元素外用Struts2标签无法直接取出基本类型及字符串的数据
	 * 方式2、通过actionContext.set()以key:value的方式存入对象栈，页面中通过ognl标签获取对应的数据
	 * 		推荐使用(*******************************************************)
	 */
	
	//方式1：无法获取除栈顶外的对象栈中的数据,不能使用
	public String addBaseTypeToObjectStack_1() {
		ActionContext.getContext().getValueStack().push(1) ;
		ActionContext.getContext().getValueStack().getRoot().add(1,1.32) ;
		ActionContext.getContext().getValueStack().getRoot().add("aaaaaa") ;
		return "objectStack_baseType" ;
	}
	
	/**
	 * 把基本数据类型、字符串放入到对象栈中并在页面中显示
	 */
	public String addBaseTypeToObjectStack_2() {
		ActionContext.getContext().getValueStack().set("int_type", 1) ;
		ActionContext.getContext().getValueStack().set("double_type", 2.23) ;
		ActionContext.getContext().getValueStack().set("string_type", "aaaaaaa") ;
		return "objectStack_baseType" ;
	}
	
	/**
	 * 把map放入到对象栈中
	 */
	public String addMapToObjectStack() {
		Map<String, Person> map = new HashMap<String, Person>() ;
		map.put("person1", new Person(2L,"李四01")) ;
		map.put("person2", new Person(2L,"李四02")) ;
		map.put("person3", new Person(2L,"李四03")) ;
		ActionContext.getContext().getValueStack().set("map", map) ;
 		return "objectStack_map" ;
	}
	
	/**
	 * 把List<Person>集合放入到对象栈中
	 */
	public String addListToObjectStack() {
		List<Person> list = new ArrayList<Person>() ;
		list.add(new Person(2l,"zhangsan01")) ;
		list.add(new Person(3l,"zhangsan02")) ;
		list.add(new Person(4l,"zhangsan03")) ;
		ActionContext.getContext().getValueStack().set("list", list) ;
		return "objectStack_list" ;
	}
	
}
